import { ScoringPeriod } from '../domain/ScoringPeriod';

/**
 * 计分周期管理服务
 * 管理每年的两个计分周期（5~10月，11~次年4月）
 */
export class ScoringPeriodService {
    private static currentPeriod: ScoringPeriod;
    private static periods: ScoringPeriod[] = [];

    public static getPeriods(index: number) : ScoringPeriod {
        return {...this.periods[index]};
    }
    
    /**
     * 初始化计分周期数据
     * 创建当前年度的两个计分周期
     */
    static initializePeriods(): void {
      const currentYear = new Date().getFullYear();
      
      // 创建5-10月周期
      const period1 = new ScoringPeriod(
        '1', 
        `${currentYear}年5-10月`, 
        `${currentYear}-05-01`, 
        `${currentYear}-10-31`, 
        true
      );
      
      // 创建11-次年4月周期
      const period2 = new ScoringPeriod(
        '2', 
        `${currentYear}年11-次年4月`, 
        `${currentYear}-11-01`, 
        `${currentYear + 1}-04-30`, 
        false
      );
      
      this.periods = [period1, period2];
      this.updateCurrentPeriod();
    }
    
    /**
     * 更新当前活跃周期
     * 根据当前日期确定哪个周期是活跃的
     */
    static updateCurrentPeriod(): void {
      const today = new Date().toISOString().split('T')[0];
      
      // 查找包含当前日期的周期
      this.currentPeriod = this.periods.find(period => 
        period.startDate <= today && period.endDate >= today
      ) || this.periods[0]; // 默认使用第一个周期
    }
    
    /**
     * 获取当前活跃周期
     * @returns 当前计分周期
     */
    static getCurrentPeriod(): ScoringPeriod {
      if (!this.currentPeriod) {
        this.initializePeriods();
      }
      return this.currentPeriod;
    }
    
    /**
     * 获取所有计分周期
     * @returns 周期列表
     */
    static getAllPeriods(): ScoringPeriod[] {
      if (this.periods.length === 0) {
        this.initializePeriods();
      }
      return this.periods;
    }
    
    /**
     * 检查周期是否即将结束（7天内）
     * @returns 是否即将结束
     */
    static isPeriodEndingSoon(): boolean {
      const currentPeriod = this.getCurrentPeriod();
      const today = new Date().toISOString().split('T')[0];
      
      const endDate = new Date(currentPeriod.endDate);
      const todayDate = new Date(today);
      const daysUntilEnd = Math.ceil((endDate.getTime() - todayDate.getTime()) / (1000 * 60 * 60 * 24));
      
      return daysUntilEnd <= 7 && daysUntilEnd >= 0;
    }
  }